%
%EJERCICIO:
%- Crea ejemplos de funciones básicas que representen las diferentes
%  posibilidades del lenguaje:
%  Sin parámetros ni retorno, con uno o varios parámetros, con retorno...
%- Comprueba si puedes crear funciones dentro de funciones.
%- Utiliza algún ejemplo de funciones ya creadas en el lenguaje.
%- Pon a prueba el concepto de variable LOCAL y GLOBAL.
%- Debes hacer print por consola del resultado de todos los ejemplos.
%  (y tener en cuenta que cada lenguaje puede poseer más o menos posibilidades)
%
%DIFICULTAD EXTRA (opcional):
%Crea una función que reciba dos parámetros de tipo cadena de texto y retorne un número.
%- La función imprime todos los números del 1 al 100. Teniendo en cuenta que:
%  - Si el número es múltiplo de 3, muestra la cadena de texto del primer parámetro.
%  - Si el número es múltiplo de 5, muestra la cadena de texto del segundo parámetro.
%  - Si el número es múltiplo de 3 y de 5, muestra las dos cadenas de texto concatenadas.
%  - La función retorna el número de veces que se ha impreso el número en lugar de los textos.
%
%Presta especial atención a la sintaxis que debes utilizar en cada uno de los casos.
%Cada lenguaje sigue una convenciones que debes de respetar para que el código se entienda.
%

% Las funciones en prolog siempre devuelven success/fail

% function sin parámetro ni retorno
no_param_no_return :- write('Esta función no tiene parémetro ni retorno').
% función con parámetro sin retorno
param_no_return(X) :- 
    write('El valor del parámetro es: '), write(X), nl.
% función sin parámetro y retorno
% en prolog las funciones no devuelven valores

% función con múltiples parámetros
multi_param(X, Y) :-
    SUM is X + Y, write('La suma es: '), write(SUM), nl.

% en prolog no hay funciones anidadas

% ejemplos de funciones existentes en prolog
built-in_functions(X) :-
    (member(X, [1, 2, 3]) ->
        write(X), write(' está en la lista'),nl
    ;
        write(X), write(' no está en la lista'),nl
    ),
    RAIZ is sqrt(X), 
    write('La raiz de '), write(X), write(' es: '), write(RAIZ), nl.

% variables locales y globales
% en prolog no hay variables globales, sólo locales


% EJERCICIO
% Predicado contador
mostrar_numeros_y_contar(Text1, Text2, Count) :-
    mostrar_numeros_y_contar(1, 100, Text1, Text2, 0).
% Caso base de retorno
mostrar_numeros_y_contar(101, _, _, _, Contador) :-
    write('Se imprimen: '),write(Contador).

% Caso recursivo, imprimir número y calcular contador
mostrar_numeros_y_contar(Numero, Maximo, TextoA, TextoB, Contador) :-
    (
        0 is Numero mod 3,
        0 is Numero mod 5 ->
        write(TextoA), write(TextoB),nl,
        ProximoNumero is Numero + 1,
        mostrar_numeros_y_contar(ProximoNumero, Maximo, TextoA, TextoB, Contador)
    ;
        0 is Numero mod 3 ->
        write(TextoA), nl,
        ProximoNumero is Numero + 1,
        mostrar_numeros_y_contar(ProximoNumero, Maximo, TextoA, TextoB, Contador)
    ;
        0 is Numero mod 5 ->
        write(TextoB), nl,
        ProximoNumero is Numero + 1,
        mostrar_numeros_y_contar(ProximoNumero, Maximo, TextoA, TextoB, Contador)
    ;
        write(Numero), nl,
        ProximoNumero is Numero + 1,
        ProximoContador is Contador + 1,
        mostrar_numeros_y_contar(ProximoNumero, Maximo, TextoA, TextoB, ProximoContador)
    ).

% Usarlo
%mostrar_numeros_y_contar('Fizz', 'Buzz', Count).
    